package cn.kais.drawer.unit;

import cn.kais.drawer.BeanUtil;
import cn.kais.drawer.UnitUtil;
import cn.kais.drawer.bean.BeanBasic;
import cn.kais.drawer.bean.BeanText;
import cn.kais.drawer.menu.MenuNumberRound;
import org.apache.commons.lang3.StringUtils;

import java.awt.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 数字
 */
public class UnitNumber {

//    public void test() throws IOException {
//        BufferedImage ima = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
//        Graphics2D sd = ima.createGraphics();
//        sd.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//
//        JSONObject mJson = DrawGenerater.doTestGetJson("number");
//        new BeanNumber(sd, mJson);
//        UnitTools.doTestWrite(ima, "TestNumber");
//
////        BufferedImage ima2 = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
////        Graphics2D sd2 = ima2.createGraphics();
////        sd2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
////
////        JSONObject mJson2 = DrawGenerater.doTestGetJson("number2");
////        new BeanNumber2(sd2, mJson2);
////        UnitTools.doTestWrite(ima2, "TestNumber2");
//
//    }

//    public BufferedImage drawer(BeanNumber bean) {
//        BufferedImage ima = new BufferedImage(500, 300, BufferedImage.TYPE_INT_ARGB);
//        Graphics2D sd = ima.createGraphics();
//        sd.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//
//        Font font = new Font("微软雅黑", Font.BOLD | Font.ITALIC, 44);
//        Color color = Color.BLACK;
//        FontMetrics metrics = sd.getFontMetrics(font);
//
//        // 拆分
//        String number = doFormatNumber(bean);
//        List<String> nums = doFormatNumber(number);
//        List<BeanBasic> list = forNumberCreateList(bean.dot, bean.dotIsIcon, nums, metrics);
//        forNumberAddFix_A(bean.fix_a, list, metrics);
//        forNumberAddFix_B(bean.fix_b, list, metrics);
//        for (int i = 0; i < list.size(); i++) {
//            BeanBasic basic = list.get(i);
//            System.out.println(basic.menu.code);
//            if (basic.menu == MenuBean.TEXT) {
//                BeanText text = (BeanText) basic;
//                AttributedString as = new AttributedString(text.text);
//                as.addAttribute(TextAttribute.FONT, font);
//                as.addAttribute(TextAttribute.FOREGROUND, color);
//                int x = AxisUtil.doCountNumberItemX(i, list);
//                sd.drawString(as.getIterator(), x, 44);
//            }
//            // 小数点 替换 需要优化
//            if (basic.menu == MenuBean.PICTURE) {
//                BeanPicture picture = (BeanPicture) basic;
//                BufferedImage icon = UnitPicture.iPictureBuffer(picture.src);
//                int x = AxisUtil.doCountNumberItemX(i, list);
//                sd.drawImage(icon, x, 0, 20, 20, null);
//
//                sd.setColor(Color.GREEN);
//                sd.drawRect(x, 0, 20, 20);
//            }
//        }
//
////        if (bLine) { // 下划线
////            as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 0, text.length());
////        }
////        if (cLine) { // 删除线
////            as.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, 0, text.length());
////        }
//
//        sd.dispose();
//        return ima;
//    }

    /**
     * 格式化 数值
     * 1.舍入
     * 2.千分
     *
     * @param bean 数值信息
     */
//    public String doFormatNumber(BeanNumber bean) {
//        int scale = UnitUtil.doStr2Int(bean.scale);
//        MenuNumberRound round = MenuNumberRound.onParseCode(bean.round);
//        BigDecimal number = new BigDecimal(bean.number);
//        BigDecimal rounded = number.setScale(scale, round.mode);
//        if (StringUtils.isNotBlank(bean.mark)) {
//            String format = "#,##0";
//            if (scale > 0) {
//                String zero = UnitUtil.doCreateZeroStr(scale);
//                format = format + "." + zero;
//            }
//            DecimalFormat df = new DecimalFormat(format);
//            return df.format(rounded);
//        }
//        return String.valueOf(rounded);
//    }

    /**
     * 对原有值进行加减乘除取余计算
     *
     * @param value  原值
     * @param type   计算类型
     * @param number 操作值
     */
    public static String doCountNumber(String value, String type, String number) {
        if (StringUtils.isBlank(type) || StringUtils.isBlank(number)) {
            return value;
        }
        BigDecimal vd = new BigDecimal(value);
        BigDecimal nd = new BigDecimal(number);
        switch (type) {
            case "+":
                vd = vd.add(nd);
                break;
            case "-":
                vd = vd.subtract(nd);
                break;
            case "*":
                vd = vd.multiply(nd);
                break;
            case "/":
                try {
                    vd = vd.divide(nd, RoundingMode.HALF_UP).setScale(10, RoundingMode.HALF_UP);
                } catch (ArithmeticException e) {
                    return "不是数字";
                }
                break;
            case "%":
                try {
                    vd = vd.remainder(nd);
                } catch (ArithmeticException e) {
                    return "不是数字";
                }
                break;
            default:
                break;
        }
        return vd.toString();
    }

    /**
     * 格式化 数值
     * 1.舍入
     * 2.千分
     *
     * @param value 数值
     * @param round 舍入模式
     * @param scale 小数位
     * @param mark  千分符
     */
    public static String doFormatNumber(String value, MenuNumberRound round, int scale, String mark) {
        BigDecimal number = new BigDecimal(value);
        BigDecimal rounded = number.setScale(scale, round.mode);
        if (StringUtils.isNotBlank(mark)) {
            String format = "#,##0";
            // 增加小数位
            if (scale > 0) {
                String zero = UnitUtil.doCreateZeroStr(scale);
                format = format + "." + zero;
            }
            DecimalFormat df = new DecimalFormat(format);
            String str = df.format(rounded);
            if (StringUtils.equals(",", mark)) {
                return str;
            }
            return str.replaceAll(",", mark);
        }
        return String.valueOf(rounded);
    }

    /**
     * 数值 添加正负标志
     *
     * @param value        数值
     * @param positiveFlag 正数标志
     * @param negativeFlag 负数标志
     */
    public static String doFixNumber(String value, String positiveFlag, String negativeFlag) {
        if (value.contains("-")) { // 负数
            if (StringUtils.isNotBlank(negativeFlag)) {
                return value.replaceAll("-", negativeFlag);
            } else {
                return value.replaceAll("-", "");
            }
        } else { // 正数
            if (StringUtils.isNotBlank(positiveFlag)) {
                return positiveFlag + value;
            } else {
                return value;
            }
        }
    }

    /**
     * 数值 + 前缀 + 后缀 组成一个新的list
     *
     * @param number  数值
     * @param preText 前缀
     * @param sufText 后缀
     * @return 下标：0 前缀 1 整数 2 小数点 3 小数 4 后缀
     */
    public static List<String> doSub5ForNumber(String number, String preText, String sufText) {
        preText = StringUtils.isNotBlank(preText) ? preText.trim() : "-";
        sufText = StringUtils.isNotBlank(sufText) ? sufText.trim() : "-";
        String[] ns = number.split("\\.", 2);
        List<String> list = new ArrayList<>();
        list.add(preText);
        list.add(ns[0]);
        list.add((ns.length > 1) ? "." : "-");
        list.add((ns.length > 1) ? ns[1] : "-");
        list.add(sufText);
        return list;
    }

    /**
     * number 拆分后的字符串数组 生成文本列表对象
     *
     * @param dot       小数点
     * @param dotIsIcon 小数点是否替换 为图片
     * @param nums      字符串数组
     * @param styles    样式
     * @return 文本列表
     */
//    public static List<BeanBasic> forNumberCreateList(String dot, boolean dotIsIcon, List<String> nums, List<JSONObject> styles) {
//        List<BeanBasic> list = new ArrayList<>();
//        for (int i = 0; i < nums.size(); i++) {
//            String num = nums.get(i);
//            if (StringUtils.isNotBlank(num)) {
//                // 替换 小数点 字符
//                if (StringUtils.isNotBlank(dot) && i == 1) {
//                    num = dot;
//                }
//                if (dotIsIcon && i == 1) { // 小数点icon
//                    BeanPicture bean = BeanUtil.inNumberForPicture(dot);
//                    list.add(bean);
//                } else { // 字符串文本
////                    BeanText bean = BeanUtil.inNumberForText(num, metrics.stringWidth(num));
////                    list.add(bean);
//                }
//            }
//        }
//        return list;
//    }

    /**
     * number 拆分后的字符串数组 生成文本列表对象
     *
     * @param dot       小数点
     * @param dotIsIcon 小数点是否替换 为图片
     * @param nums      字符串数组
     * @param metrics   字体相关
     * @return 文本列表
     */
//    public static List<BeanBasic> forNumberCreateList(String dot, boolean dotIsIcon, List<String> nums, FontMetrics metrics) {
//        List<BeanBasic> list = new ArrayList<>();
//        for (int i = 0; i < nums.size(); i++) {
//            String num = nums.get(i);
//            if (StringUtils.isNotBlank(num)) {
//                // 替换 小数点 字符
//                if (StringUtils.isNotBlank(dot) && i == 1) {
//                    num = dot;
//                }
//                if (dotIsIcon && i == 1) { // 小数点icon
//                    BeanPicture bean = BeanUtil.inNumberForPicture(dot);
//                    list.add(bean);
//                } else { // 字符串文本
//                    BeanText bean = BeanUtil.inNumberForText(num, metrics.stringWidth(num));
//                    list.add(bean);
//                }
//            }
//        }
//        return list;
//    }

    /**
     * 插入前缀
     *
     * @param fix     前缀字符串
     * @param list    数字拆分后的文本列表
     * @param metrics 字体信息 用于获取字符串宽度
     */
    public static void forNumberAddFix_B(String fix, List<BeanBasic> list, FontMetrics metrics) {
        if (StringUtils.isBlank(fix)) {
            return;
        }
        BeanText bean = BeanUtil.inNumberForText(fix, metrics.stringWidth(fix));
        list.add(0, bean);
    }

    /**
     * 插入后缀
     */
    public static void forNumberAddFix_A(String fix, List<BeanBasic> list, FontMetrics metrics) {
        if (StringUtils.isBlank(fix)) {
            return;
        }
        BeanText bean = BeanUtil.inNumberForText(fix, metrics.stringWidth(fix));
        list.add(bean);
    }

    /**
     * 创建 text
     *
     * @param text    文本内容
     * @param i       下标： 0整数 1小数点 2小数 99前缀后缀
     * @param metrics 字体相关
     */
    public static BeanText doCreateUnitText(String text, int i, FontMetrics metrics) {
        // todo 调整
        BeanText bean = new BeanText();
        bean.text = text;
        bean.width = metrics.stringWidth(text);
        return bean;
    }

}
